package org.example.v5.statemachine;

import java.util.logging.Logger;

/**
 * AbstractStateAction 抽象类，提供模板方法模式的基础实现。
 * @param <S> 状态机类型
 * @param <E> 事件类型
 */
public abstract class AbstractStateAction<S, E extends Enum<E>> implements StateAction<S, E> {

    protected static final Logger LOGGER = Logger.getLogger(StateMachine.class.getName());

    @Override
    public void handle(S context, E event) {
        if (isValidEvent(event)) {
            try {
                // 处理事件
                handleInternal(context, event);
                nextState(context, event);
                onEventSuccess(context, event);
            } finally {
                onAfter(context, event);
            }
        } else {
            onInvalidEvent(context, event);
        }
    }

    /**
     * 检查事件是否有效。
     * @param event 触发事件
     * @return 是否有效
     */
    protected abstract boolean isValidEvent(E event);

    /**
     * 处理成功事件后的状态转换。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected abstract void nextState(S context, E event);

    /**
     * 处理事件。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected abstract void handleInternal(S context, E event);

    /**
     * 成功处理事件后的操作。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected void onEventSuccess(S context, E event) {
    }

    /**
     * 处理无效事件。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected void onInvalidEvent(S context, E event) {
        LOGGER.warning("无效事件：{}，行为无效。");
    }

    /**
     * 处理事件后的清理操作。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected void onAfter(S context, E event) {
    }
}